我們常常看到for loop出現i++
或++i
,但不管是使用哪一種,結果都沒有差別。
所以i++
跟++i
是相同的東西嗎?
當然不是,如果我們直接使用i++
或++i
,兩者的輸出是相等的。(可以先理解為相同
我們直接看看程式
int main(){
int A=2;
int B=2;
A++;
++B;
printf("A=%d B=%d \n",A,B);
return 0;
}
兩者A與B的輸出均是3
但只要我們是以表示式來使用,效果就不一樣了。
int main(){
int A = 2;
int B = 2;
int C = A++;
int D = ++B;
printf("C=%d D=%d \n",C,D);
return 0;
}
A++:意思是先把A放到C,再執行A=A+1 的動作。
因為A先放到C,所以C的值會是2
++B:意思是先再執行B=B+1,再把B放到D。
因為B會先執行B=B+1的動作,所以D的值會是3
=============分格線=============
那我出例題,看大家能不能算出正確的值
int main(){
int A=2 , AA=0;
int B=2 , BB=0;
AA = (A++) + (A++);
BB = (++B) + (B++);
printf("A=%d B=%d\n",AA,BB);
return 0;
}
在**=** 的右端,我們從左往右看AA = (A++) + (A++);
左方的A++ : 是指先執行A=2,下一次再執行A=A+1
右方的A++ : 由於**左方的A++**所輸出的值是2,因此在此處的A也是2。同樣地,先執行A=2,下一次再執行A=A+1
(A++) + (A++) : 左方的A++與右方的A++,也均為2,所以我們可以理解為AA=2+2,所以AA值為4
=============
BB = (++B) + (B++);
左方的++B : (已知B=2)是指先執行B=2+1,所以B=3
右方的B++ : (目前B=3)是指先執行B=3,下一次再執行B=B+1
(++B) + (B++) : 左方的++B與右方的B++,也均為3,所以我們可以理解為BB=3+3,所以BB值為6
=============分格線=============
但覺得很少人會同一個表示式連續用2次,而且可讀性不高,注腳不方便。
我記得有一位工程師說過:以前很喜歡用int A=0,B=0,C=0;
,一整行宣告所有變數
但當上工程師後就會很討厭這種寫法,會把每一變數單獨宣告
int A=0; //XXXXXX
int B=0; //XXXXXX
int C=0; //XXXXXX
因為這樣比較好理解,注腳也比較方便
您好,我自己跟著實作一次,但是結果不一樣耶,如下:
AA=5
BB=7
我自己的理解是:
AA = (A++) + (A++);
第一次A++時,A還是保持為2
在第二次A++前,A已經變成3,所以最後A會是4
而AA=2+3=5
BB = (++B) + (B++);
這部分我就始終不理解為什麼會是7? 而不是BB=3+3=6?
希望能幫我解惑,謝謝
https://iter01.com/567099.html
我也探討這ㄍ問題一陣子
這篇的作者探討的很仔細
應該可以幫您解惑
以下為文章內容
C語言創始人明確指出:
自增與自減運算只能作用於變數,類似於(i+j)++是非法的,因為自增運算包含了賦值運算,而表示式不能作為賦值運算的左值。
所以,在這裡(i++)+(i++)也是非法的,因為在前一個i++的作用下,後面的i就已經是表示式了,表示式不能再做++操作
同理 (++i)+(i++)本身是非法的
但編譯器關係其實本身是可以計算的
所以才會有那麼畸形的結果